let Symbol  = window.Symbol
let idCounter = 0

if (!Symbol) {
    Symbol = function Symbol(key) {
        return `__${key}_${Math.floor(Math.random() * 1e9)}_${++idCounter}__`
    }

    Symbol.iterator = Symbol('Symbol.iterator')
}

window.Symbol = Symbol

const __ = {
    poolDic: Symbol('poolDic')
}

/**
 * 简易的对象池实现
 * 用于对象的存贮和重复使用
 * 可以有效减少对象创建开销和避免频繁的垃圾回收
 * 提高游戏性能
 */
export default class Pool {
    constructor() {
        this[__.poolDic] = {}
    }

    /**
     * 根据对象标识符
     * 获取对应的对象池
     */
    getPoolBySign(name) {
        return this[__.poolDic][name] || ( this[__.poolDic][name] = [] )
    }

    /**
     * 根据传入的对象标识符，查询对象池
     * 对象池为空创建新的类，否则从对象池中取
     */
    getItemByClass(name, className) {
        let pool = this.getPoolBySign(name)

        let result = (  pool.length
            ? pool.shift()
            : new className()  )

        return result
    }

    /**
     * 将对象回收到对象池
     * 方便后续继续使用
     */
    recover(name, instance) {
        this.getPoolBySign(name).push(instance)
    }
}

export let pool = new Pool();
